﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using kk.components.contracts;
using kk.messages.contracts.DataModel;
using NUnit.Framework;

namespace kk.saalbestuhlungsadapter.tests
{
    [TestFixture]
    public class testSaalbestuhlungsAdapter
    {
        [Test]
        public void Reihenkürzel_aus_Reihennummer_berechnen()
        {
            Assert.AreEqual('A', SaalbestuhlungsAdapter.BerechneReihenkürzelAusReihennummer(0));
            Assert.AreEqual('B', SaalbestuhlungsAdapter.BerechneReihenkürzelAusReihennummer(1));
            Assert.AreEqual('Z', SaalbestuhlungsAdapter.BerechneReihenkürzelAusReihennummer(25));
        }


        [Test]
        public void Reihe_mit_einem_Sitz()
        {
            var plätze = SaalbestuhlungsAdapter.ParseRow("X", 0).ToArray();

            Assert.AreEqual(1, plätze.Length);
            Assert.AreEqual('A', plätze[0].Platzposition.Reihe);
            Assert.AreEqual(1, plätze[0].Platzposition.Platznummer);
            Assert.AreEqual('X', plätze[0].PreiskategorieSchlüssel);
        }


        [Test]
        public void Reihe_mit_mehreren_Sitzen()
        {
            var plätze = SaalbestuhlungsAdapter.ParseRow("XYZ", 1).ToArray();

            Assert.AreEqual(3, plätze.Length);
            Assert.AreEqual('B', plätze[0].Platzposition.Reihe);
            Assert.AreEqual(1, plätze[0].Platzposition.Platznummer);
            Assert.AreEqual('X', plätze[0].PreiskategorieSchlüssel);

            Assert.AreEqual('B', plätze[1].Platzposition.Reihe);
            Assert.AreEqual(2, plätze[1].Platzposition.Platznummer);
            Assert.AreEqual('Y', plätze[1].PreiskategorieSchlüssel);

            Assert.AreEqual('B', plätze[2].Platzposition.Reihe);
            Assert.AreEqual(3, plätze[2].Platzposition.Platznummer);
            Assert.AreEqual('Z', plätze[2].PreiskategorieSchlüssel);
        }


        [Test]
        public void Mehrere_Reihen_von_Sitzen()
        {
            var plätze = SaalbestuhlungsAdapter.ParseRows(new[] {"X", "YZ"}).ToArray();

            Assert.AreEqual(3, plätze.Length);
            Assert.AreEqual('A', plätze[0].Platzposition.Reihe);
            Assert.AreEqual(1, plätze[0].Platzposition.Platznummer);
            Assert.AreEqual('X', plätze[0].PreiskategorieSchlüssel);

            Assert.AreEqual('B', plätze[1].Platzposition.Reihe);
            Assert.AreEqual(1, plätze[1].Platzposition.Platznummer);
            Assert.AreEqual('Y', plätze[1].PreiskategorieSchlüssel);

            Assert.AreEqual('B', plätze[2].Platzposition.Reihe);
            Assert.AreEqual(2, plätze[2].Platzposition.Platznummer);
            Assert.AreEqual('Z', plätze[2].PreiskategorieSchlüssel);
        }


        [Test]
        public void Plätze_aus_Saaldatei()
        {
            var plätze = SaalbestuhlungsAdapter.ParseFile("testsaal.txt").ToArray();

            Assert.AreEqual(3, plätze.Length);
            Assert.AreEqual('A', plätze[0].Platzposition.Reihe);
            Assert.AreEqual(1, plätze[0].Platzposition.Platznummer);
            Assert.AreEqual('X', plätze[0].PreiskategorieSchlüssel);

            Assert.AreEqual('B', plätze[1].Platzposition.Reihe);
            Assert.AreEqual(1, plätze[1].Platzposition.Platznummer);
            Assert.AreEqual('Y', plätze[1].PreiskategorieSchlüssel);

            Assert.AreEqual('B', plätze[2].Platzposition.Reihe);
            Assert.AreEqual(2, plätze[2].Platzposition.Platznummer);
            Assert.AreEqual('Z', plätze[2].PreiskategorieSchlüssel);
        }


        [Test]
        public void Mit_InputPin_lesen()
        {
            var sut = new SaalbestuhlungsAdapter("testsaal.txt");

            Platz[] plätze = new Platz[0];
            sut.ProcessBestuhlungZuSaal(new Request<string, Saalplan>("1234", r => plätze = r.Plätze.ToArray()));

            Assert.AreEqual(3, plätze.Length);
            Assert.AreEqual('A', plätze[0].Platzposition.Reihe);
            Assert.AreEqual(1, plätze[0].Platzposition.Platznummer);
            Assert.AreEqual('X', plätze[0].PreiskategorieSchlüssel);

            Assert.AreEqual('B', plätze[1].Platzposition.Reihe);
            Assert.AreEqual(1, plätze[1].Platzposition.Platznummer);
            Assert.AreEqual('Y', plätze[1].PreiskategorieSchlüssel);

            Assert.AreEqual('B', plätze[2].Platzposition.Reihe);
            Assert.AreEqual(2, plätze[2].Platzposition.Platznummer);
            Assert.AreEqual('Z', plätze[2].PreiskategorieSchlüssel);
        }
    }
}
